home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 2 / Atari Mega Archive CD - Volume 2.iso / minix / up1510b.tgz / up1510b / src / commands / at.c < prev    next >
C/C++ Source or Header  |  1990-07-15  |  5KB  |  171 lines

  1. /* at - run a command at a specified time    Author: Jan Looyen */
  2.  
  3. #include <sys/types.h>
  4. #include <time.h>
  5. #include <fcntl.h>
  6. #include <stdio.h>
  7.  
  8. #define    STARTDAY    0    /* see ctime(3)     */
  9. #define    LEAPDAY        STARTDAY+59
  10. #define    MAXDAYNR    STARTDAY+365
  11. #define    NODAY        -2
  12.  
  13.  
  14. main(argc, argv, envp)
  15. int argc;
  16. char **argv, **envp;
  17. {
  18.   int i, count, ltim, year, getltim(), getlday(), lday = NODAY;
  19.   char c, buf[10], job[30], *dp, *sp;
  20.   struct tm *p, *localtime();
  21.   long clock;
  22.   FILE *fp, *pin, *popen();
  23.  
  24. /*-------------------------------------------------------------------------*
  25.  *    check arguments    & pipe to "pwd"                           *
  26.  *-------------------------------------------------------------------------*/
  27.   if (argc < 2 || argc > 5) {
  28.     fprintf(stderr, "Usage: %s time [month day] [file]\n", argv[0]);
  29.     exit(1);
  30.   }
  31.   if ((ltim = getltim(argv[1])) == -1) {
  32.     fprintf(stderr, "%s: wrong time specification\n", argv[0]);
  33.     exit(1);
  34.   }
  35.   if ((argc == 4 || argc == 5) && (lday = getlday(argv[2], argv[3])) == -1) {
  36.     fprintf(stderr, "%s: wrong date specification\n", argv[0]);
  37.     exit(1);
  38.   }
  39.   if ((argc == 3 || argc == 5) && open(argv[argc - 1], O_RDONLY) == -1) {
  40.     fprintf(stderr, "%s: cannot find: %s\n", argv[0], argv[argc - 1]);
  41.     exit(1);
  42.   }
  43.   if ((pin = popen("pwd", "r")) == NULL) {
  44.     fprintf(stderr, "%s: cannot open pipe to cmd 'pwd'\n", argv[0]);
  45.     exit(1);
  46.   }
  47.  
  48. /*-------------------------------------------------------------------------*
  49.  *    determine execution time and create 'at' job file           *
  50.  *-------------------------------------------------------------------------*/
  51.   time(&clock);
  52.   p = localtime(&clock);
  53.   year = p->tm_year;
  54.   if (lday == NODAY) {        /* no [month day] given */
  55.     lday = p->tm_yday;
  56.     if (ltim <= (p->tm_hour * 100 + p->tm_min)) {
  57.         lday++;
  58.         if (lday == MAXDAYNR && (year % 4) || lday == MAXDAYNR + 1) {
  59.             lday = STARTDAY;
  60.             year++;
  61.         }
  62.     }
  63.   } else
  64.     switch (year % 4) {
  65.         case 0:
  66.         if (lday < p->tm_yday || lday == p->tm_yday &&
  67.             ltim <= (p->tm_hour * 100 + p->tm_min)) {
  68.             year++;
  69.             if (lday > LEAPDAY) lday--;
  70.         }
  71.         break;
  72.         case 1:
  73.         case 2:
  74.         if (lday > LEAPDAY) lday--;
  75.         if (lday < p->tm_yday || lday == p->tm_yday &&
  76.             ltim <= (p->tm_hour * 100 + p->tm_min))
  77.             year++;
  78.         break;
  79.         case 3:
  80.         if (lday < ((lday > LEAPDAY) ? p->tm_yday + 1 : p->tm_yday) ||
  81.             lday == ((lday > LEAPDAY) ? p->tm_yday + 1 : p->tm_yday) &&
  82.             ltim <= (p->tm_hour * 100 + p->tm_min))
  83.             year++;
  84.         else if (lday > LEAPDAY)
  85.             lday--;
  86.         break;
  87.     }
  88.   sprintf(job, "/usr/spool/at/%02d.%03d.%04d.%02d",
  89.     year % 100, lday, ltim, getpid() % 100);
  90.   if ((fp = fopen(job, "w")) == NULL) {
  91.     fprintf(stderr, "%s: cannot create %s\n", argv[0], job);
  92.     exit(1);
  93.   }
  94.  
  95. /*-------------------------------------------------------------------------*
  96.  *    write environment and command(s) to 'at'job file           *
  97.  *-------------------------------------------------------------------------*/
  98.   i = 0;
  99.   while (envp[i] != NULL) {
  100.     count = 1;
  101.     dp = buf;
  102.     sp = envp[i];
  103.     while ((*dp++ = *sp++) != '=') count++;
  104.     *--dp = '\0';
  105.     fprintf(fp, "%s='%s'; export %s\n", buf, &envp[i++][count], buf);
  106.   }
  107.   fprintf(fp, "cd ");
  108.   while ((c = getc(pin)) != EOF) putc(c, fp);
  109.   fprintf(fp, "umask %o\n", umask());
  110.   if (argc == 3 || argc == 5)
  111.     fprintf(fp, "%s\n", argv[argc - 1]);
  112.   else                /* read from stdinput */
  113.     while ((c = getchar()) != EOF) putc(c, fp);
  114.  
  115.   printf("%s: %s created\n", argv[0], job);
  116.   exit(0);
  117. }
  118.  
  119. /*-------------------------------------------------------------------------*
  120.  *    getltim()        return((time OK) ? daytime : -1)       *
  121.  *-------------------------------------------------------------------------*/
  122. getltim(t)
  123. char *t;
  124. {
  125.   if (t[4] == '\0' && t[3] >= '0' && t[3] <= '9' &&
  126.       t[2] >= '0' && t[2] <= '5' && t[1] >= '0' && t[1] <= '9' &&
  127.       (t[0] == '0' || t[0] == '1' || t[1] <= '3' && t[0] == '2'))
  128.     return(atoi(t));
  129.   else
  130.     return(-1);
  131. }
  132.  
  133. /*-------------------------------------------------------------------------*
  134.  *    getlday()        return ((date OK) ? yearday : -1)       *
  135.  *-------------------------------------------------------------------------*/
  136. getlday(m, d)
  137. char *m, *d;
  138. {
  139.   int i, month, day, im;
  140.   static int cumday[] = {0, 0, 31, 60, 91, 121, 152,
  141.                182, 213, 244, 274, 305, 335};
  142.   static struct date {
  143.     char *mon;
  144.     int dcnt;
  145.   } *pc,
  146.    kal[] = {
  147.     "Jan", 31, "Feb", 29, "Mar", 31, "Apr", 30,
  148.     "May", 31, "Jun", 30, "Jul", 31, "Aug", 31,
  149.     "Sep", 30, "Oct", 31, "Nov", 30, "Dec", 31
  150.   };
  151.  
  152.   pc = kal;
  153.   im = (digitstring(m)) ? atoi(m) : 0;
  154.   m[0] &= 0337;
  155.   for (i = 1; i < 13 && strcmp(m, pc->mon) && im != i; i++, pc++);
  156.   if (i < 13 && (day = (digitstring(d)) ? atoi(d) : 0) && day <= pc->dcnt) {
  157.     if (!STARTDAY) day--;
  158.     return(day + cumday[i]);
  159.   } else
  160.     return(-1);
  161. }
  162.  
  163.  
  164.  
  165. digitstring(s)
  166. char *s;
  167. {
  168.   while (*s >= '0' && *s <= '9') s++;
  169.   return((*s == '\0') ? 1 : 0);
  170. }
  171.